package com.example.springboottest.example.file;

import java.io.*;
import java.nio.charset.Charset;

public class BufferStreamTest {
    /**
     * 从文件中读取文本
     * BufferedInputStream继承于FilterInputStream，提供缓冲输入流功能。
     * 缓冲输入流相对于普通输入流的优势是，它提供了一个缓冲数组，
     * 每次调用read方法的时候，它首先尝试从缓冲区里读取数据，若读取失败（缓冲区无可读数据），
     * 则选择从物理数据源（譬如文件）读取新数据（这里会尝试尽可能读取多的字节）放入到缓冲区中，
     * 最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源（譬如文件）读取速度快。
     * <p>
     * BufferedInputStream(InputStream in) 默认8192字节  即8k
     * BufferedInputStream(InputStream in, int size)
     */
    public void readFromFile(String filename) {

        BufferedInputStream bufferedInput = null;
        byte[] buffer = new byte[1024];

        try {

            //创建BufferedInputStream 对象
            bufferedInput = new BufferedInputStream(new FileInputStream(filename));

            int bytesRead = 0;

            //从文件中按字节读取内容，到文件尾部时read方法将返回-1
            while ((bytesRead = bufferedInput.read(buffer)) != -1) {

                //将读取的字节转为字符串对象
                String chunk = new String(buffer, 0, bytesRead);
                System.out.print(chunk);
            }

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            //关闭 BufferedInputStream
            try {
                if (bufferedInput != null)
                    bufferedInput.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public void writeToFile(String filename) {
        BufferedOutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(filename));
            String data = "hello, 中国人";
            byte[] bytes = data.getBytes(Charset.forName("UTF-8"));
            out.write(bytes);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                out.close();// 关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
